package cn.caplike.demo.consistence.threadpool.and.blockingqueue.request;


import cn.caplike.demo.consistence.threadpool.and.blockingqueue.context.entity.Inventory;
import cn.caplike.demo.consistence.threadpool.and.blockingqueue.context.service.InventoryService;
import cn.caplike.demo.consistence.threadpool.and.blockingqueue.core.Request;
import lombok.extern.slf4j.Slf4j;

/**
 * Copyright © 2018 五月工作室. All rights reserved.
 * <p>
 * 数据更新操作
 * 1. 先删除缓存中的数据
 * 2. 再更新数据库中的数据
 **/
@Slf4j
public class InventoryDatabaseRequest implements Request {

    private Inventory inventory;

    private InventoryService inventoryService;

    /**
     * 构造器
     */
    public InventoryDatabaseRequest(Inventory inventory, InventoryService inventoryService) {
        log.info("--- ---> 构造请求对象, {}, {}", inventory, inventoryService);
        this.inventory = inventory;
        this.inventoryService = inventoryService;
    }

    /**
     * 库存数据库操作
     * 1. 先删除缓存中对应的数据
     * 2. 更新数据库中的数据
     */
    @Override
    public void process() {
        log.info("--- --- ---> 数据库操作 - 移除缓存中的数据");
        // 首先删除缓存中的数据
        this.inventoryService.removeCache(this.inventory.getId());
        // 为了测试 所以这里操作时间长点
        try {
            log.info("--- --- ---> 数据库操作 - 等待 3 秒操作");
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 再更新数据库中的数据
        log.info("--- --- ---> 数据库操作 - 更新数据库中的数据");
        this.inventoryService.update(this.inventory);
    }

    /**
     * 接口返回库存记录的ID
     */
    @Override
    public String getInventoryId() {
        return this.inventory.getId();
    }

    /**
     * 始终不更新
     */
    @Override
    public Boolean isForceRefresh() {
        return Boolean.FALSE;
    }
}

